home *** CD-ROM | disk | FTP | other *** search
- #ifndef IF_H
- #define IF_H
- /* $Id: if.h,v 1.11 1993/08/04 22:15:13 ppessi Exp $
- *
- * Copyright (c) 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>,
- * Helsinki University of Technology, Finland.
- * All rights reserved.
- *
- * if.h --- Network Interface
- *
- * HISTORY
- * $Log: if.h,v $
- * Revision 1.11 1993/08/04 22:15:13 ppessi
- * Removed sockaddr_sana2 from public interface.
- *
- * Revision 1.10 1993/08/01 19:30:23 ppessi
- * Added sockaddr_sana2 structure definitions here.
- *
- * Revision 1.9 1993/06/04 11:16:15 jraja
- * Fixes for first public release.
- *
- * Revision 1.8 1993/05/16 21:09:43 ppessi
- * RCS version changed.
- *
- * Revision 1.7 1993/04/19 02:10:55 ppessi
- * arp protos removed.
- *
- * Revision 1.6 93/04/13 22:20:01 22:20:01 jraja (Jarno Tapio Rajahalme)
- * Fixed typo on comment.
- *
- * Revision 1.5 93/04/11 22:21:14 22:21:14 jraja (Jarno Tapio Rajahalme)
- * Removed unnecessary casts from function pointers, Changed ellipses to
- * prototypes.
- *
- * Revision 1.4 93/03/10 21:30:34 21:30:34 ppessi (Pekka Pessi)
- * Added IF_H
- *
- * Revision 1.3 93/03/05 03:12:09 03:12:09 ppessi (Pekka Pessi)
- * Compiles with SASC. Initial test version
- *
- * Revision 1.2 93/02/25 19:51:14 19:51:14 ppessi (Pekka Pessi)
- * Added prototypes
- *
- * Revision 1.1 92/11/20 14:58:42 14:58:42 jraja (Jarno Tapio Rajahalme)
- * Initial revision
- *
- *
- */
-
- /*
- * Mach Operating System
- * Copyright (c) 1992 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
- /*
- * HISTORY
- * Log: if.h,v
- * Revision 2.2 92/05/25 14:44:36 rwd
- * Fix includes.
- * [92/05/18 rwd]
- *
- * Revision 2.1 92/04/21 17:13:59 rwd
- * BSDSS
- *
- *
- */
-
- /*
- * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)if.h 7.11 (Berkeley) 3/19/91
- */
-
- /*
- * Structures defining a network interface, providing a packet
- * transport mechanism (ala level 0 of the PUP protocols).
- *
- * Each interface accepts output datagrams of a specified maximum
- * length, and provides higher level routines with input datagrams
- * received from its medium.
- *
- * Output occurs when the routine if_output is called, with three parameters:
- * (*ifp->if_output)(ifp, m, dst)
- * Here m is the mbuf chain to be sent and dst is the destination address.
- * The output routine encapsulates the supplied datagram if necessary,
- * and then transmits it on its medium.
- *
- * On input, each interface unwraps the data received by it, and either
- * places it on the input queue of a internetwork datagram routine
- * and posts the associated software interrupt, or passes the datagram to a raw
- * packet input routine.
- *
- * Routines exist for locating interfaces by their addresses
- * or for locating a interface on a certain network, as well as more general
- * routing and gateway routines maintaining information used to locate
- * interfaces. These routines live in the files if.c and route.c
- */
- #ifndef _TIME_ /* XXX fast fix for SNMP, going away soon */
- #include <sys/time.h>
- #endif
-
- /*
- * Structure defining a queue for a network interface.
- *
- * (Would like to call this struct ``if'', but C isn't PL/1.)
- */
-
- struct ifqueue {
- struct mbuf *ifq_head;
- struct mbuf *ifq_tail;
- int ifq_len;
- int ifq_maxlen;
- int ifq_drops;
- };
-
- struct ifnet {
- char *if_name; /* name, e.g. ``en'' or ``lo'' */
- short if_unit; /* sub-unit for lower level driver */
- short if_mtu; /* maximum transmission unit */
- short if_flags; /* up/down, broadcast, etc. */
- short if_timer; /* time 'til if_watchdog called */
- int if_metric; /* routing metric (external only) */
- struct ifaddr *if_addrlist; /* linked list of addresses per if */
- struct ifqueue if_snd; /* output queue */
- /* procedure handles */
- int (*if_init)(); /* init routine */
- int (*if_output)(struct ifnet *, /* output routine (enqueue) */
- struct mbuf *,
- struct sockaddr *, struct rtentry *);
- int (*if_start)(); /* initiate output routine */
- int (*if_done)(); /* output complete routine */
- int (*if_ioctl)(struct ifnet *, int, caddr_t); /* ioctl routine */
- int (*if_reset)(); /* bus reset routine */
- int (*if_watchdog)(); /* timer routine */
- /* generic interface statistics */
- int if_ipackets; /* packets received on interface */
- int if_ierrors; /* input errors on interface */
- int if_opackets; /* packets sent on interface */
- int if_oerrors; /* output errors on interface */
- int if_collisions; /* collisions on csma interfaces */
- /* end statistics */
- struct ifnet *if_next;
- u_char if_type; /* ethernet, tokenring, etc */
- u_char if_addrlen; /* media address length */
- u_char if_hdrlen; /* media header length */
- u_char if_index; /* numeric abbreviation for this if */
- /* more statistics here to avoid recompiling netstat */
- struct timeval if_lastchange; /* last updated */
- int if_ibytes; /* total number of octets received */
- int if_obytes; /* total number of octets sent */
- int if_imcasts; /* packets received via multicast */
- int if_omcasts; /* packets sent via multicast */
- int if_iqdrops; /* dropped on input, this interface */
- int if_noproto; /* destined for unsupported protocol */
- int if_baudrate; /* linespeed */
- int if_pcount; /* number of promiscuous listeners */
- };
-
- #define IFF_UP 0x1 /* interface is up */
- #define IFF_BROADCAST 0x2 /* broadcast address valid */
- #define IFF_DEBUG 0x4 /* turn on debugging */
- #define IFF_LOOPBACK 0x8 /* is a loopback net */
- #define IFF_POINTOPOINT 0x10 /* interface is point-to-point link */
- #define IFF_NOTRAILERS 0x20 /* avoid use of trailers */
- #define IFF_RUNNING 0x40 /* resources allocated */
- #define IFF_NOARP 0x80 /* no address resolution protocol */
- /* next two not supported now, but reserved: */
- #define IFF_PROMISC 0x100 /* receive all packets */
- #define IFF_ALLMULTI 0x200 /* receive all multicast packets */
- #define IFF_OACTIVE 0x400 /* transmission in progress */
- #define IFF_SIMPLEX 0x800 /* can't hear own transmissions */
-
- /* flags set internally only: */
- #define IFF_CANTCHANGE \
- (IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|IFF_SIMPLEX)
-
- /*
- * Output queues (ifp->if_snd) and internetwork datagram level (pup level 1)
- * input routines have queues of messages stored on ifqueue structures
- * (defined above). Entries are added to and deleted from these structures
- * by these macros, which should be called with ipl raised to splimp().
- */
- #define IF_QFULL(ifq) ((ifq)->ifq_len >= (ifq)->ifq_maxlen)
- #define IF_DROP(ifq) ((ifq)->ifq_drops++)
- #define IF_ENQUEUE(ifq, m) { \
- (m)->m_nextpkt = 0; \
- if ((ifq)->ifq_tail == 0) \
- (ifq)->ifq_head = m; \
- else \
- (ifq)->ifq_tail->m_nextpkt = m; \
- (ifq)->ifq_tail = m; \
- (ifq)->ifq_len++; \
- }
- #define IF_PREPEND(ifq, m) { \
- (m)->m_nextpkt = (ifq)->ifq_head; \
- if ((ifq)->ifq_tail == 0) \
- (ifq)->ifq_tail = (m); \
- (ifq)->ifq_head = (m); \
- (ifq)->ifq_len++; \
- }
- #define IF_DEQUEUE(ifq, m) { \
- (m) = (ifq)->ifq_head; \
- if (m) { \
- if (((ifq)->ifq_head = (m)->m_nextpkt) == 0) \
- (ifq)->ifq_tail = 0; \
- (m)->m_nextpkt = 0; \
- (ifq)->ifq_len--; \
- } \
- }
-
- #define IFQ_MAXLEN 50
- #define IFNET_SLOWHZ 1 /* granularity is 1 second */
-
- /*
- * The ifaddr structure contains information about one address
- * of an interface. They are maintained by the different address families,
- * are allocated and attached when an address is set, and are linked
- * together so all addresses for an interface can be located.
- */
- struct ifaddr {
- struct sockaddr *ifa_addr; /* address of interface */
- struct sockaddr *ifa_dstaddr; /* other end of p-to-p link */
- #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
- struct sockaddr *ifa_netmask; /* used to determine subnet */
- struct ifnet *ifa_ifp; /* back-pointer to interface */
- struct ifaddr *ifa_next; /* next address for interface */
- void (*ifa_rtrequest)(int, /* check or clean routes (+ or -)'d */
- struct rtentry *, struct sockaddr *);
- struct rtentry *ifa_rt; /* ??? for ROUTETOIF */
- u_short ifa_flags; /* mostly rt_flags for cloning */
- u_short ifa_llinfolen; /* extra to malloc for link info */
- };
- #define IFA_ROUTE RTF_UP /* route installed */
- /*
- * Interface request structure used for socket
- * ioctl's. All interface ioctl's must have parameter
- * definitions which begin with ifr_name. The
- * remainder may be interface specific.
- */
- struct ifreq {
- #define IFNAMSIZ 64
- char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
- union {
- struct sockaddr ifru_addr;
- struct sockaddr ifru_dstaddr;
- struct sockaddr ifru_broadaddr;
- short ifru_flags;
- int ifru_metric;
- caddr_t ifru_data;
- } ifr_ifru;
- #define ifr_addr ifr_ifru.ifru_addr /* address */
- #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
- #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
- #define ifr_flags ifr_ifru.ifru_flags /* flags */
- #define ifr_metric ifr_ifru.ifru_metric /* metric */
- #define ifr_data ifr_ifru.ifru_data /* for use by interface */
- };
-
- struct ifaliasreq {
- char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */
- struct sockaddr ifra_addr;
- struct sockaddr ifra_broadaddr;
- struct sockaddr ifra_mask;
- };
-
- /*
- * Structure used in SIOCGIFCONF request.
- * Used to retrieve interface configuration
- * for machine (useful for programs which
- * must know all networks accessible).
- */
- struct ifconf {
- int ifc_len; /* size of associated buffer */
- union {
- caddr_t ifcu_buf;
- struct ifreq *ifcu_req;
- } ifc_ifcu;
- #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
- #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
- };
-
- #ifndef IF_ARP_H
- #include <net/if_arp.h>
- #endif
-
- #ifdef KERNEL
- extern struct ifnet *ifnet;
- extern struct ifqueue rawintrq; /* raw packet input queue */
- #include <net/if_protos.h>
- #include <net/if_loop_protos.h>
- #endif /* KERNEL */
-
- #endif /* IF_H */
-